
#include <stdio.h>
#include <stdlib.h>
#include "WProgram.h"
#include "WString.h"
#include "./protocol.h"
#include "./status.h"
#include "./display.h"

#define TEMP_INT '1'
#define TEMP_EXT '2'
#define TEMP_POSITIVE '+'
#define TEMP_NEGATIVE '-'

extern display LCD;
extern status Status;

char pilotLight[6]="LXX\r\n";
char pilotLoad[6]="CXX\r\n";
char pilotSprinkler[9]="SXXTTT\r\n";

/*extern presentation LCD;
//extern scheduler RTC;
*/

protocol::protocol() {
	answer[0]='0';
	answer[1]='0';
	answer[2]='0';
	answer[3]='0';
	answer[4]='0';
	rxCommand='x';
	address='0';
}

void protocol::start(long speed){
	Serial.begin(speed);
	delay(3000);
    Serial.print("+++");
    delay(3000);
    //LCD.clear();
    //LCD.print("+++:");
    Serial.print("ATDH00000000\r");
    //LCD.print("ATDH:");
    delay(1000);  
    Serial.print("ATDL0000FFFF\r");
    //LCD.print("ATDL:");
    delay(1000);
    Serial.print("ATCN\r");
    //LCD.print("ATCN:");
    delay(1000);
}  

void protocol::readNetwork(char incoming){
	unsigned int v;
	int incomingByte=char(incoming);             //byte ricevuto dal canale	
	char signTemperature;
	
	switch(incomingByte) {
		case 'T':
			cnt=0;        //resetta il contatore di caratteri
			rxCommand=char(incomingByte);
			Serial.println("T command");
			break;
		default:
			switch(cnt){
				case 0:			//address of temperature (1=internal, 2=external)
					address=char(incomingByte);
					//Serial.println((char)incomingByte);
					Serial.println(address);
					cnt++;
					break;
				case 1:			//sign of the temperature Â± (+positive, -negative)
					signTemperature=char(incomingByte);
					//Serial.println((char)incomingByte);
					Serial.println(signTemperature);
					cnt++;
					arrayCnt=0;
					break;
				case 2:    //0: primo numero: leggi, memorizza incrementa 
                        answer[arrayCnt]=char(incomingByte);
						arrayCnt++;
                        cnt++;
                        break;
				case 3:    //1,2: secondo e terzo numero: leggi, aggiungi, incrementa
				case 4:
					answer[arrayCnt]=char(incomingByte);
					arrayCnt++;
					cnt++;         
					break;
				case 5:    //3: ultimo numero: leggi, aggiungi, mostra sul display incrementa
					answer[arrayCnt]=char(incomingByte);
					arrayCnt++;
					cnt++;
					answer[4]=0;
					//archivia
					v=(answer[0]-0x30)*1000+(answer[1]-0x30)*100+(answer[2]-0x30)*10+(answer[3]-0x30);
					Serial.println(v);
					
					if(address=='1'){
						//if(signTemperature==TEMP_POSITIVE){				//da rivedere!
							Status.setInternalTempSign('+');
							Status.setTempInt(v);
							//LCD.printIntTemp(v);
							//Serial.println("Setting int temp");
							//Serial.println(v);
						/*}else if(signTemperature==TEMP_NEGATIVE){
							Status.setInternalTempSign('-');
							Status.setTempInt(v);
							Serial.println("Setting int temp");
							Serial.println(v);
						}*/
					}else if(address=='2'){
						//if(signTemperature==TEMP_POSITIVE){				//da rivedere!
							Status.setExternalTempSign('+');
							Status.setTempExt(v);
							//LCD.printExtTemp(v);
							//Serial.println("Setting ext temp");
							//Serial.println(v);
						/*}else if(signTemperature==TEMP_NEGATIVE){
							Status.setExternalTempSign('-');
							Status.setTempExt(v);
							Serial.println("Setting ext temp");
							Serial.println(v);
						}*/
					}
					break;				
			}
			break;
	}
	
 }
/********************************************************************/
 /*
 * Definisce e invia il messaggio di invio della temperatura interna.
 * TZÂ±OOOO:
 *		T comando temperatura;
 *		Z tipo di sensore (1=interno, 2=esterno); [in questo caso stiamo lavorando con la sonda esterna. (2)]
 *		Â± temperatura positiva o negativa;
 *		OOOO parte intera dei gradi celsius;
 *		La parte decimale viene approssimata all'intero.
 */
String protocol::sendInternalTemp(){

	char intTemp[8]="T1XXXXX";
	int temp=Status.getTempInt();
	if(Status.getInternalTempSign()=='+'){
		intTemp[2]='+';
	}else if(Status.getInternalTempSign()=='-'){
		intTemp[2]='-';
	}else{
		intTemp[2]='Â±';
	}
    String s=String(temp);
      if (s.length()==1) { 
        if(s.charAt(0)=='-'){
        s[0]='0';
        }                    
      s="000"+s;
    }
    else if(s.length()==2) {
      if(s.charAt(0)=='-'){
        s[0]='0';
      }
      s="00"+s;      
    }
    else if(s.length()==3) {
      if(s.charAt(0)=='-'){
        s[0]='0';
      }
      s="0"+s;    
    }else if(s.length()==4){
      if(s.charAt(0)=='-'){
        s[0]='0';
      }
    }
	intTemp[3]=s.charAt(0);
    intTemp[4]=s.charAt(1);
    intTemp[5]=s.charAt(2);
    intTemp[6]=s.charAt(3);	
	
	return (String)intTemp;
	//Serial.println(intTemp);
}
 
/*
 * Definisce e invia il messaggio di invio della temperatura esterna.
 * TZÂ±OOOO:
 *		T comando temperatura;
 *		Z tipo di sensore (1=interno, 2=esterno); [in questo caso stiamo lavorando con la sonda esterna. (2)]
 *		Â± temperatura positiva o negativa;
 *		OOOO parte intera dei gradi celsius;
 *		La parte decimale viene approssimata all'intero.
 */
String protocol::sendExternalTemp(){

	char extTemp[8]="T2XXXXX";
	int temp=Status.getTempExt();
	if(Status.getExternalTempSign()=='+'){
		extTemp[2]='+';
	}else if(Status.getExternalTempSign()=='-'){
		extTemp[2]='-';
	}else{
		extTemp[2]='Â±';
	}
    String s=String(temp);
      if (s.length()==1) { 
        if(s.charAt(0)=='-'){
        s[0]='0';
        }                    
      s="000"+s;
    }
    else if(s.length()==2) {
      if(s.charAt(0)=='-'){
        s[0]='0';
      }
      s="00"+s;      
    }
    else if(s.length()==3) {
      if(s.charAt(0)=='-'){
        s[0]='0';
      }
      s="0"+s;    
    }else if(s.length()==4){
      if(s.charAt(0)=='-'){
        s[0]='0';
      }
    }
	extTemp[3]=s.charAt(0);
    extTemp[4]=s.charAt(1);
    extTemp[5]=s.charAt(2);
    extTemp[6]=s.charAt(3);	
	
	return (String)extTemp;
	//Serial.println(extTemp);
}	

/********************************************************************/

void protocol::readDomesticPC(char incoming){
	unsigned int v;
	int incomingByte=char(incoming);             //byte ricevuto dal canale	
	
	switch(incomingByte) {
		case 'L':
			cnt2=0;        //resetta il contatore di caratteri
			arrayCnt2=1;
			rxCommand2=char(incomingByte);
			Serial.println("L command");
			break;
		case 'C':
			cnt2=0;        //resetta il contatore di caratteri
			arrayCnt2=1;
			rxCommand2=char(incomingByte);
			Serial.println("C command");
			break;
		case 'S':
			cnt2=0;        //resetta il contatore di caratteri
			arrayCnt2=1;
			rxCommand2=char(incomingByte);
			Serial.println("S command");
			break;
		default:
			switch(cnt2){
				case 0:
					if(rxCommand2=='L'){						//address light
						pilotLight[arrayCnt2]=char(incomingByte);
						cnt2++;
						arrayCnt2++;
					}else if(rxCommand2=='C'){					//address load
						pilotLoad[arrayCnt2]=char(incomingByte);
						cnt2++;
						arrayCnt2++;
					}else if(rxCommand2=='S'){					//address sprinkler 
						pilotSprinkler[arrayCnt2]=char(incomingByte);
						cnt2++;
						arrayCnt2++;
					}
					break;
				case 1:
					if(rxCommand2=='L'){						//command light on/off
						pilotLight[arrayCnt2]=char(incomingByte);
						cnt2++;
						//messaggio completo
						Serial.print(pilotLight);
					}else if(rxCommand2=='C'){					//command load on/off
						pilotLoad[arrayCnt2]=char(incomingByte);
						cnt2++;
						//messaggio completo
						Serial.print(pilotLoad);
					}else if(rxCommand2=='S'){					//command srinkl on/off
						pilotSprinkler[arrayCnt2]=char(incomingByte);
						cnt2++;
						arrayCnt2++;
					}
					break;
				case 2:
					if(rxCommand2=='S'){
						arrayCnt2=0;
						pilotSprinkler[arrayCnt2]=char(incomingByte);
						cnt2++;
						arrayCnt2++;
					}
					break;
				case 3:
					if(rxCommand2=='S'){
						arrayCnt2=0;
						pilotSprinkler[arrayCnt2]=char(incomingByte);
						cnt2++;
						arrayCnt2++;
					}
					break;
				case 4:
				if(rxCommand2=='S'){
						arrayCnt2=0;
						pilotSprinkler[arrayCnt2]=char(incomingByte);
						cnt2++;
						arrayCnt2++;
					}
					//messaggio completo reset variabili
					rxCommand2=='x';
					Serial.print(pilotSprinkler);
					//flush out del messaggio nella network xbee
					break;
			}
			break;
	}
}

